
"""
 1、编写一个学生方法，产生一堆学生对象（姓名），传入形参控制学生生成数量

# def create_studebts(n):
#
#     students = []   # 创建一个空的列表来接收我们要生成的值
#
#     for i in range(1,n+1):   # 循环 从1 - n (包含 n)
#
#          name = f"学生{i}"   # 构造姓名  学生x
#
#          students.append(name)   #添加到列表中
#     return students   # 返回名字列表
#
# students_list = create_studebts(5)   # 调用  函数并且生成 5 个学生
#
# print('生成学生的姓名')
# for name in students_list:  # 循环打印生成的结果就完事了
#     print(name)



"""




"""

2、创建一个方法，用来生成普通人必备的信息：姓名、年龄、住址、身份证号、手机号，
随机生成20个写入personinfo.txt里 格式：姓名：xxx 年龄：xxx 住址：xxx 身份证号：xxx
"""


# import  random
# import string
#
# def  generate_person():
#     """
#     定义一个函数，主要是接收信息
#     :return:
#     """
#     name = ''.join(random.choices(string.ascii_lowercase,k = 5)).title()
#     """
#     random.choices(string.ascii_lowercase,k = 5
#     从26个英文字母中 返回5个 并且返回五个字符串
#     .join 将列表拼接成字符串
#     .title：将首字母大写
#     """
#     age  = random.randint(1,1000)
#
#     addresses = ['北京','上海','辽宁','阜新','本溪','淄博','沈阳']
#     address = random.choice(addresses)
#     id_card = ''.join(random.choices('0123456789',k=18))
#     phone = '1'+''.join(random.choices('0123456789',k=10))
#
#     return{
#         '姓名': name,
#         '年龄': age,
#         '住址': address,
#         '身份证号': id_card,
#         '手机号'  : phone
#     }
#
# with open('personinfo.txt','w',encoding='utf-8') as f:
#
#     for _ in range(20):  # _  我不想需要这个有变量去接收使用
#         person = generate_person()
#         line = f"姓名：{person['姓名']} 年龄{person['年龄']} 住址{person['住址']} 身份证号{person['身份证号']} 手机号{person['手机号']}\n"
#         f.write(line)
#
# print('已经写完20个人的信息')



"""

3、文本 student.txt中包含下面的内容 zhangshan:30 lisi:50 wangwu:60 lifei:70 
期望能够统计出其中的内容，以dict的形式保存，例如： {"zhangshan":30,"lisi":50,"wangwu":60,"lifei":70} 
#
# def read_student_scores():
#     scores = {}
#     try:
#         with open('student.txt','r',encoding='utf-8') as f:
#             for line in f:
#                 line = line.strip()   #  strip  去掉换行符
#                 if not line:
#                     continue  # 跳过空行
#                 name,score = line.split(':')  # 以 ： 进行分割 key 以及value
#                 scores[name] = int(score)   # 转【换位整数
#
#     except FileExistsError:
#         print('student文件不存在，请创建')
#     return scores
# result = read_student_scores()
# print(result)

"""




"""

4、给你一个 非空 整数数组 nums ，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素
# def find_single_number(nums):  # XOR
#
#     result = 0
#
#     for num in nums:
#
#         result ^= num      # XOR 或者是 异或  对两个整数进行一个比对   result = num ^ result   把result num  异或结果重新赋值给result
#
#     return result
#
# nums = [2,3,4,4,2]
#
# print(find_single_number(nums))

"""

"""
5、输入：["1","a","b","3","5","8","_"] 想要提取里面得数字，并保存到一个列表中
"""
#
# def extract_digits(lst):
#     degits = []
#     for item in lst:
#         if item.isdigit():   # 判断是否是纯的数字字符串  isdigit
#             degits.append(int(item))
#     return degits
# data =  ["1","a","b","3","5","8","_"]
# numbers = extract_digits(data)
#
# print(numbers)



"""
写函数,函数接收的4个参数分别是:姓名,性别(默认为男),年龄,地址 
用户通过input输入这4个内容(支持持续输入,Q或q退出),并传递给函数，函数接收到这些内容,将其追加到student_msg文件中 
"""


# def save_student_info(name,gender='男',age = None,address=None):
#     with open('student_msg','a',encoding='utf-8') as f:
#         line = f"姓名：{name}性别：{gender}年龄：{age} 住址：{address}\n"
#         f.write(line)
# while True:
#     user_input = input("请输入姓名，性别，年龄，住址，输入Q退出：")
#     if user_input.lower() == 'q':   # 将输入的字母是大写的Q那么转换为小写 ，然后进行判定
#         print('退出系统')
#         break
#     parts = user_input.split(',')
#     if len(parts) < 4:
#         print('输入的格式是错误的，请按照姓名，性别，年龄，住址')
#         continue   # 跳过当前循环的代码，开始下一次循环
#
#     name ,gender ,age , address = [p.strip() for p in parts ]   # 列表推导式 去除空白的字符
#
#     save_student_info(name,gender,age,address)
#     print("信息已经保存")



"""

 7、打印功能菜单、添加学生信息、删除学生信息、修改学生信息、显示学生信息、退出系统，
 并且需要接收用户的输入，在根据输入内容调用相应函数实现相应功能（存入文件），
 模板图如下。每次对学生管理系统发生改动，要写入改动点到log.txt文本中
"""

# 7、打印功能菜单、添加学生信息、删除学生信息、修改学生信息、显示学生信息、退出系统，并且需要接收用户的输入，在根据输入内容调用相应函数实现相应功能（存入文件），
# 模板图如下。每次对学生管理系统发生改动，要写入改动点到log.txt文本中
#
# def add_stu():
#     new_stu_name = input("请输入姓名：")
#     new_stu_sex = input("性别：")
#     new_stu_age = input("年龄：")
#     new_stu_info = f"{new_stu_name},{new_stu_sex},{new_stu_age}\n"
#     with open('students.txt', 'a', encoding='utf-8') as f:
#         f.write(new_stu_info)
#     print(f"{new_stu_name}添加成功")
#
# def del_stu():
#     stu_to_del = input("请输入要删除的学生姓名：")
#     stu_list= []
#     deleted = False
#     with open('students.txt', 'r', encoding='utf-8') as f:
#         for stu in f:
#             stu_list.append(stu.strip())
#     with open('students.txt', 'w', encoding='utf-8') as f:
#         for stu in stu_list:
#             if stu:
#                 name = stu.split(',')[0]
#                 if name != stu_to_del:
#                     f.write(stu + '\n')
#                 else:
#                     deleted = True
#     if deleted:
#         print(f"{stu_to_del}删除成功")
#     else:
#         print(f"未找到名为{stu_to_del}的学生")
#
#
# def modify_stu():
#     stu_to_modify = input("请输入要修改的学生姓名：")
#     stu_list = []
#     modified = False
#     with open('students.txt', 'r', encoding='utf-8') as f:
#         for stu in f:
#             stu_list.append(stu.strip())
#     with open('students.txt', 'w', encoding='utf-8') as f:
#         for stu in stu_list:
#             if stu:
#                 name, sex, age = stu.split(',')
#                 if name == stu_to_modify:
#                     print(f"当前信息：姓名：{name}，性别：{sex}，年龄：{age}")
#                     new_name = input("请输入新姓名（不修改按回车）：").strip() or name
#                     new_sex = input("请输入新性别（不修改按回车）：").strip() or sex
#                     new_age = input("请输入新年龄（不修改按回车）：").strip() or age
#                     if new_age and not new_age.isdigit():
#                         print("年龄必须是数字！修改失败")
#                         f.write(stu + '\n')
#                         return
#                     f.write(f"{new_name},{new_sex},{new_age}\n")
#                     modified = True
#                 else:
#                     f.write(stu + '\n')
#     if modified:
#         print("修改成功")
#     else:
#         print(f"未找到名为{stu_to_modify}的学生")
#
# def show_stu():
#     print("\n===== 学生信息列表 =====")
#     with open('students.txt', 'r', encoding='utf-8') as f:
#         students = [line.strip() for line in f if line.strip()]
#
#     if not students:
#         print("暂无学生信息")
#     else:
#         print(f"{'姓名':<10} {'性别':<5} {'年龄':<5}")
#         print("-" * 25)
#         for stu in students:
#             name, sex, age = stu.split(',')
#             print(f"{name:<10} {sex:<5} {age:<5}")
#     print("=======================\n")
#
# def main():
#     while True:
#        print("1.添加学生信息"
#              "2.删除学生信息"
#              "3.修改学生信息"
#              "4.显示学生信息"
#              "5.退出系统")
#        i = int(input())
#        if i ==1:
#            add_stu()
#        elif i==2:
#            del_stu()
#        elif i==3:
#            modify_stu()
#        elif i==4:
#            show_stu()
#        elif i==5:
#            print("已退出系统")
#            break
# main()




"""

 7、打印功能菜单、添加学生信息、删除学生信息、修改学生信息、显示学生信息、退出系统，
 并且需要接收用户的输入，在根据输入内容调用相应函数实现相应功能（存入文件），
 模板图如下。每次对学生管理系统发生改动，要写入改动点到log.txt文本中"""
import os

if not os.path.exists('students.txt'):
    open("studentd.txt",'w').close()
    """
    检查文件是否存在
    """


if not os.path.exists('log.txt'):
    open("studentd.txt",'w').close()
    """
    检查文件是否存在
    """


def log_change(action):
    """
    将每次操作写入txt中
    :param action:
    :return:
    """
    with open('log.txt','a',encoding='utf-8') as f:   # 表示追加 相当于 append
        f.write(f"执行操作：{action}\n")

   #添加
def add_student():
    name = input('请输入姓名：')
    with open('students.txt','a',encoding='utf-8') as f:
        f.write(name + '\n')
    print('添加成功')

    log_change(f"添加学生{name}")

    # 删除
def delete_student():
    name = input('请输入删除的姓名：')
    students = read_all_students()
    if name in students:
        students.remove(name)
        with open('students.txt','w',encoding='utf-8') as f:
            f.write(name + '\n')
        print('删除成功')
        log_change(f"删除学生{name}")
    else:
        print('姓名不存在')

  # 修改
def modify_student():
    old_name = input('请输入原名称')
    new_name = input('请输入新的名称')
    students = read_all_students()

    if old_name in students:
        idx = students.index(old_name)
        students[idx] =new_name
        with open('students.txt','w',encoding='utf-8') as f:
            for s in students:
                f.write(s + '\n')
        print('修改成功')
        log_change(f'修改{old_name} -> {new_name}')
    else:
        print('学生不存在')
    # 显示学生信息
def show_students():
    students = read_all_students()
    if students:
        print('当前学生列表')
        for s in students:
            print(s)
    else:
        print('列表为空')

def read_all_students():
    """
    添加一个辅助的函数，用来检查文档
    :return:
    """
    try:
        with open('students.txt','r',encoding='utf-8') as f:
            return [line.strip()  for line in f if line.strip()]  #   line.strip 去除空格
    except:
        return []   # 如果意外情况，文件没有   权限不足等异常情况，那么 返回一个空的列表，不至于程序崩溃


def main():
    while True:
       print("1.添加学生信息"
             "2.删除学生信息"
             "3.修改学生信息"
             "4.显示学生信息"
             "5.退出系统")
       i = int(input("请输入功能数字："))
       if i ==1:
           add_student()
       elif i==2:
           delete_student()
       elif i==3:
           modify_student()
       elif i==4:
           show_students()
       elif i==5:
           print("已退出系统")
           break
       else:
           print("无效的输入方式")
main()






